package com.firefighting.util;


import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.util.Random;

/** 
 * 验证码生成工具 
 */  
public class CaptchaUtil {
   private BufferedImage image;//图像
   private String str;//验证码
   private static char code[] ="abcdefghijkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789".toCharArray();
   public static final String SESSION_CODE_NAME="code";
   
   
   private CaptchaUtil(){
	   // 初始化属性 
	   init();
   }
   
   //取得RandomNumUtil实例 
   public static CaptchaUtil getInstance(){
	   return new CaptchaUtil();
   }
   
   //取得验证码图片 
   public BufferedImage getImage(){
	   return this.image;
   }
   
   //取得图片的验证码  
   public String getString(){
	   return this.str;
   }
   
   private void init(){
	   // 在内存中创建图象
	   int width=60,height=20;
	   BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
	   // 获取图形上下文
	   Graphics g = image.getGraphics();
	   // 生成随机类
	   Random random = new Random();
	   //设定背景色
	   g.setColor(getRandColor(200,250));
	   g.fillRect(0, 0, width, height);
	   //设定字体
	   g.setFont(new Font("Times New Roman", Font.PLAIN, 18));
	   // 随机产生155条干扰线，使图象中的认证码不易被其它程序探测到
	   g.setColor(getRandColor(160,200));
	   for(int i=0;i<155;i++){
		   int x=random.nextInt(width);
		   int y=random.nextInt(height);
		   int x1=random.nextInt(12);
		   int y1=random.nextInt(12);
		   g.drawLine(x, y, x+x1, y+y1);
   		}
	   
	   // 取随机产生的认证码(4位数字)
	   String sRand="";
	   for(int i=0;i<4;i++){
		   String rand = String.valueOf(code[random.nextInt(code.length)]);
		   sRand += rand;
		   // 将认证码显示到图象中
		   g.setColor(new Color(20+random.nextInt(110),20+random.nextInt(110),20+random.nextInt(110)));
		   // 调用函数出来的颜色相同，可能是因为种子太接近，所以只能直接生成 
		   g.drawString(rand, 13*i+6, 16);
	   }
	   this.str = sRand;
	   // 图象生效 
	   g.dispose();
	   /* 赋值图像 */
	   this.image = image;
   }
   
   public Color getRandColor(int fc,int bc){
	   Random random=new Random();
	   if(fc>255)
		   fc=255;
	   if(bc>255)
		   bc=255;
	   int r=fc+random.nextInt(bc-fc);
	   int g=fc+random.nextInt(bc-fc);
	   int b=fc+random.nextInt(bc-fc);
	   return new Color(r,g,b);
   }
   
}
